// fs模块用于文件和目录操作
const fs = require('fs')
const fsp = fs.promises
const path = require('path')
const os = require('os')

// 文件路径
// let filepath = path.resolve('./logs/access.log')
// 读取文件
// 同步  在不指定编码的情况下返回一个buffer流(二进制 => 16进制)
// 对于数据源进行编码转换
// try {
//   let data = fs.readFileSync(filepath, 'utf-8')
//   console.log(data)
// } catch (error) {
//   console.log('没有')
//   throw new Error('aaaaa')
// } finally {
//   console.log('无论上面是否有错，我都执行')
// }

// 异步   nodejs，错误优先原则，回调中，第1个参数永远给错误对象
// let filepath = path.resolve('./logs/access.log')
// fs.readFile(filepath, 'utf-8', (err, data) => {
//   if (err) {
//     console.log('读取文件异常')
//   } else {
//     console.log(data)
//   }
// })


// const readFile = filepath => (
//   new Promise((resolve, reject) => {
//     fs.readFile(filepath, 'utf-8', (err, data) => {
//       if (err) {
//         reject('读取文件异常')
//       } else {
//         resolve(data)
//       }
//     })
//   })
// )
// let filepath = path.resolve('./logs/access.log')
// readFile(filepath).then(data => console.log(data)).catch(er => console.log(er))
// /* function readFile(filepath) {
//   return new Promise((resolve, reject) => {
//     fs.readFile(filepath, 'utf-8', (err, data) => {
//       if (err) {
//         reject('读取文件异常')
//       } else {
//         resolve(data)
//       }
//     })
//   })
// } */


// let filepath = path.resolve('./logs/access.log')
// fsp.readFile(filepath, 'utf-8').then(data => console.log(data)).catch(er => console.log(er))

// ==================================== 写文件
// 同步
// 定义写入文件路径
// const filepath = path.resolve('./logs/a1.log')
// const data = '你好 -- ' + Date.now() + os.EOL

// 如果文件不存在则创建后写入，存在直接覆盖写入
// 写入文件还需要注意和操作系统中的权限相关  
// mac下面如果有权限问题 sudo chmod 777 log
// 写入文件 -- 创建文件写入
// fs.writeFileSync(filepath, data)
// 它也可以追加
// fs.writeFileSync(filepath, data, {
//   // 标记，写入的方式 a+ 可读可写  r  w a
//   flag: 'a+'
// })
// 追加写入，如果文件不存在也是先创建后追加写入  --- 日志记录
// fs.appendFileSync(filepath, data)

// 复制
// 先读取源数据，写入到新目标地址中
// let src = path.resolve('./logs/access.log')
// let dest = path.resolve('./logs/access_bak.log')
// fs.writeFileSync(dest, fs.readFileSync(src))

// 数据源
// let src = path.resolve('./logs/access.log')
// let dest = path.resolve('./logs/access_bak.log')
// // 读流 pipe管道
// fs.createReadStream(src).pipe(fs.createWriteStream(dest))


// 异步
// let src = path.resolve('./logs/a1.log')
// const data = '你好 -- ' + Date.now() + os.EOL
/* fs.writeFile(src, data, err => {
  if (!err) {
    console.log('写入成功')
  }
})
 */
// fs.writeFile(src, data, {
//   flag: 'a'
// }, err => {
//   if (!err) {
//     console.log('写入成功')
//   }
// })


// 查看文件是否存在
// let src = path.resolve('./logs/a1.log')

// // 如果存在返回为true,否则为false
// if (fs.existsSync(src)) {
//   // console.log('文件存在')
//   // 删除此文件  删除文件也是和操作系统中用户权限相关的，有可能不一定能删除成功
//   fs.unlinkSync(src)
// }

/* // 查看当前文件的属性信息
let src = path.resolve('./logs/access.log')
// 异步
fs.stat(src, (err, stat) => {
  // 当前文件的大小
  console.log(stat.size)
  // 文件修改的时间
  console.log(stat.mtime)
  // 是否为文件
  console.log(stat.isFile())
  // 是否为目录
  console.log(stat.isDirectory())
})

const stat = fs.statSync(src)
// 当前文件的大小
console.log(stat.size)
// 文件修改的时间
console.log(stat.mtime)
// 是否为文件
console.log(stat.isFile())
// 是否为目录
console.log(stat.isDirectory())
 */



// -------------------- 目录操作
// 创建目录   默认情况下，要创建目录的父级一定要存在
// let dirpath = path.resolve('./logs/a/b/c')
// let dirpath = path.resolve('./logs/aa')
// 默认情况下，要创建目录的父级一定要存在
// fs.mkdirSync(dirpath)
// 递归创建
// fs.mkdirSync(dirpath, { recursive: true })

// 删除目录 默认只能删除空目录，如果目录下面有文件，则删除不了
// rmdir 在nodejs16之后不推荐使用
// fs.rmdirSync(dirpath)
// 递归删除
// fs.rmdirSync(dirpath, { recursive: true })
// 推荐使用它，删除文件和目录
// fs.rm(dirpath, { recursive: true }, () => { })


// 读取目录下面的文件列表 
let dirpath = path.resolve('./logs')
let dirs = fs.readdirSync(dirpath)
if (dirs.length > 0) {
  dirs = dirs.map(dir => path.join(dirpath, dir))
}
dirs.forEach(dir => {
  if (fs.statSync(dir).isDirectory()) {
    console.log(dir, '目录')
  } else {
    console.log(dir, '文件')
  }
})




